{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T05:45:24.827192Z",
     "start_time": "2020-08-20T05:45:24.804207Z"
    }
   },
   "outputs": [],
   "source": [
    "# 定义两个list分别存放两个板块的帖子数据\n",
    "academy_titles = []\n",
    "job_titles = []\n",
    "with open('academy_titles.txt', encoding='utf8') as f:\n",
    "    for l in f:  # 按行读取文件\n",
    "        academy_titles.append(l.strip( ))  # strip 方法用于去掉行尾空格\n",
    "with open('job_titles.txt', encoding='utf8') as f:\n",
    "    for l in f:  # 按行读取文件\n",
    "        job_titles.append(l.strip())  # strip 方法用于去掉行尾空格"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T05:57:11.940441Z",
     "start_time": "2020-08-20T05:57:11.898553Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1570\n"
     ]
    }
   ],
   "source": [
    "char_set = set()\n",
    "for title in academy_titles:\n",
    "    for ch in title:\n",
    "        char_set.add(ch)\n",
    "for title in job_titles:\n",
    "    for ch in title:\n",
    "        char_set.add(ch)\n",
    "print(len(char_set))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:50:44.787954Z",
     "start_time": "2020-08-20T13:50:44.774989Z"
    }
   },
   "outputs": [],
   "source": [
    "import json\n",
    "with open('char_list', 'w') as f:\n",
    "    json.dump(char_list, f)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:28:21.609183Z",
     "start_time": "2020-08-20T13:28:21.590234Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "char_list = list(char_set)\n",
    "n_chars = len(char_list) + 1 # 加一个 UNK\n",
    "\n",
    "def title_to_tensor(title):\n",
    "    tensor = torch.zeros(len(title), dtype=torch.long)\n",
    "    for li, ch in enumerate(title):\n",
    "        try:\n",
    "            ind = char_list.index(ch)\n",
    "        except ValueError:\n",
    "            ind = n_chars - 1\n",
    "        tensor[li] = ind\n",
    "    return tensor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T05:58:42.034988Z",
     "start_time": "2020-08-20T05:58:42.012003Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch.nn as nn\n",
    "\n",
    "class RNN(nn.Module):\n",
    "    def __init__(self, word_count, embedding_size, hidden_size, output_size):\n",
    "        super(RNN, self).__init__()\n",
    "        \n",
    "        self.hidden_size = hidden_size\n",
    "        self.embedding = torch.nn.Embedding(word_count, embedding_size)\n",
    "        self.i2h = nn.Linear(embedding_size + hidden_size, hidden_size)\n",
    "        self.i2o = nn.Linear(embedding_size + hidden_size, output_size)\n",
    "        self.softmax = nn.LogSoftmax(dim=1)\n",
    "\n",
    "    def forward(self, input_tensor, hidden):\n",
    "        word_vector = self.embedding(input_tensor)\n",
    "        combined = torch.cat((word_vector, hidden), 1)\n",
    "        hidden = self.i2h(combined)\n",
    "        output = self.i2o(combined)\n",
    "        output = self.softmax(output)\n",
    "        return output, hidden\n",
    "\n",
    "    def initHidden(self):\n",
    "        return torch.zeros(1, self.hidden_size)\n",
    "\n",
    "embedding_size = 100\n",
    "n_hidden = 128\n",
    "n_categories = 2\n",
    "rnn = RNN(n_chars, embedding_size, n_hidden, n_categories)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T09:18:48.000054Z",
     "start_time": "2020-08-20T09:18:47.993073Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input_tensor:\n",
      " tensor([ 603, 1261,  348,  456,  264, 1441,  519,  725,  393,  164,   99,  329,\n",
      "        1441,  407,  706,   68, 1050, 1093, 1036, 1009, 1337])\n"
     ]
    }
   ],
   "source": [
    "input_tensor = title_to_tensor(academy_titles[0])\n",
    "print('input_tensor:\\n', input_tensor)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T09:19:02.237124Z",
     "start_time": "2020-08-20T09:19:02.195237Z"
    }
   },
   "outputs": [],
   "source": [
    "embedding_size = 100\n",
    "n_hidden = 128\n",
    "n_categories = 2\n",
    "rnn = RNN(n_chars, embedding_size, n_hidden, n_categories)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T09:20:26.026626Z",
     "start_time": "2020-08-20T09:20:26.005683Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "output:\n",
      " tensor([[-0.8858, -0.5317]], grad_fn=<LogSoftmaxBackward>)\n",
      "hidden:\n",
      " tensor([[ 5.2449e-01, -3.9349e-01, -7.3347e-01, -8.7151e-01, -2.3355e-02,\n",
      "          2.1722e-01,  4.2904e-01, -6.1375e-01,  7.1260e-02, -5.2419e-01,\n",
      "          2.5654e-01, -6.8565e-01, -1.7574e-01,  2.4180e-01, -7.2139e-01,\n",
      "          2.6328e-01,  5.7687e-02, -2.8678e-01,  9.5489e-02,  1.4498e-01,\n",
      "         -2.4770e-01, -6.8509e-01, -1.2721e-01,  9.8257e-02, -3.7497e-01,\n",
      "         -4.5346e-01, -4.4051e-02,  5.5337e-01, -1.1477e-01,  8.5730e-01,\n",
      "          5.9344e-02,  4.3765e-01,  3.1932e-01,  3.9857e-02, -2.9155e-01,\n",
      "         -6.3812e-03,  7.0143e-02,  3.4756e-01, -9.2751e-02, -5.6816e-01,\n",
      "         -3.6907e-02, -4.3333e-01, -2.8850e-01, -2.5131e-02,  1.8361e-01,\n",
      "          1.4500e-01, -5.0976e-01,  1.3032e-01, -7.6227e-01, -3.2029e-01,\n",
      "          1.0924e-01,  1.6284e-01, -6.8014e-02, -3.1434e-01,  7.3906e-01,\n",
      "         -5.2798e-01, -3.6526e-01, -6.3783e-02,  1.1164e+00, -3.9446e-01,\n",
      "          5.1537e-03, -3.3970e-01, -5.3975e-01, -2.5797e-01,  4.0025e-02,\n",
      "         -6.1468e-01, -4.4710e-01, -6.2586e-02, -5.5238e-01,  6.3304e-02,\n",
      "          1.5929e-01,  1.3862e-01,  1.7486e-01,  1.1899e-01, -3.1981e-01,\n",
      "          7.0062e-02, -1.0096e-01, -8.5973e-03,  3.2817e-04, -2.5374e-01,\n",
      "         -1.4955e-01, -3.7216e-02, -3.1879e-01,  3.1099e-02, -9.2592e-02,\n",
      "          5.3188e-01,  1.2412e-01,  7.1930e-02,  3.7323e-02,  1.0627e-01,\n",
      "         -4.3717e-01, -4.4458e-01, -8.4759e-02,  2.5701e-01,  6.9226e-01,\n",
      "         -3.3771e-01, -1.2311e-01, -6.4821e-01,  2.3966e-01,  3.5318e-02,\n",
      "          2.1533e-02, -1.9019e-01,  4.8417e-01,  6.4547e-02,  3.1144e-01,\n",
      "         -4.2180e-01,  8.0349e-01, -2.3420e-01, -4.2878e-01, -6.0126e-02,\n",
      "          6.4502e-01, -7.1060e-02, -1.1077e-01,  3.8406e-01, -1.7482e-01,\n",
      "         -4.4484e-01,  2.2427e-01,  2.1569e-01, -2.4453e-01, -1.9768e-01,\n",
      "          6.0909e-01,  3.7423e-01,  9.7817e-02,  2.1102e-01, -9.7066e-01,\n",
      "         -1.0586e-01,  1.8856e-01, -2.1299e-02]], grad_fn=<AddmmBackward>)\n",
      "size of hidden:\n",
      " torch.Size([1, 128])\n"
     ]
    }
   ],
   "source": [
    "hidden = rnn.initHidden()\n",
    "output, hidden = rnn(input_tensor[0].unsqueeze(dim=0), hidden)\n",
    "print('output:\\n', output)\n",
    "print('hidden:\\n', hidden)\n",
    "print('size of hidden:\\n', hidden.size())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T05:58:43.341769Z",
     "start_time": "2020-08-20T05:58:43.330750Z"
    }
   },
   "outputs": [],
   "source": [
    "def run_rnn(rnn, input_tensor):\n",
    "    hidden = rnn.initHidden()\n",
    "    for i in range(input_tensor.size()[0]):\n",
    "        output, hidden = rnn(input_tensor[i].unsqueeze(dim=0), hidden)\n",
    "    return output"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:25:34.903109Z",
     "start_time": "2020-08-20T13:25:34.883164Z"
    }
   },
   "outputs": [],
   "source": [
    "all_data = []\n",
    "categories = [\"考研考博\", \"招聘信息\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:19:44.246439Z",
     "start_time": "2020-08-20T13:19:41.505767Z"
    }
   },
   "outputs": [],
   "source": [
    "for l in academy_titles:\n",
    "    all_data.append((title_to_tensor(l), torch.tensor([0], dtype=torch.long)))\n",
    "for l in job_titles:\n",
    "    all_data.append((title_to_tensor(l), torch.tensor([1], dtype=torch.long)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T06:03:01.886039Z",
     "start_time": "2020-08-20T06:03:01.868088Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train data size:  4975\n",
      "Test data size:  2133\n"
     ]
    }
   ],
   "source": [
    "import random\n",
    "random.shuffle(all_data)\n",
    "data_len = len(all_data)\n",
    "split_ratio = 0.7\n",
    "train_data = all_data[:int(data_len*split_ratio)]\n",
    "test_data = all_data[int(data_len*split_ratio):]\n",
    "print(\"Train data size: \", len(train_data))\n",
    "print(\"Test data size: \", len(test_data))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T06:01:10.070244Z",
     "start_time": "2020-08-20T06:01:10.051249Z"
    }
   },
   "outputs": [],
   "source": [
    "def train(rnn, criterion, input_tensor, category_tensor):\n",
    "    rnn.zero_grad()\n",
    "    output = run_rnn(rnn, input_tensor)\n",
    "    loss = criterion(output, category_tensor)\n",
    "    loss.backward()\n",
    "\n",
    "    # 根据梯度更新模型的参数\n",
    "    for p in rnn.parameters():\n",
    "        p.data.add_(p.grad.data, alpha=-learning_rate)\n",
    "\n",
    "    return output, loss.item()\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T06:01:12.931342Z",
     "start_time": "2020-08-20T06:01:12.924361Z"
    }
   },
   "outputs": [],
   "source": [
    "def evaluate(rnn, input_tensor):\n",
    "    with torch.no_grad():\n",
    "        hidden = rnn.initHidden()\n",
    "        output = run_rnn(rnn, input_tensor)\n",
    "        return output"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T12:48:25.336557Z",
     "start_time": "2020-08-20T12:46:16.374158Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████████████████████████████████████████████████████████████████████████| 4975/4975 [02:04<00:00, 40.00it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████| 2133/2133 [00:04<00:00, 467.71it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy 0.992498827941866\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "from tqdm import tqdm\n",
    "epoch = 1\n",
    "embedding_size = 200\n",
    "n_hidden = 10\n",
    "n_categories = 2\n",
    "learning_rate = 0.005\n",
    "rnn = RNN(n_chars, embedding_size, n_hidden, n_categories)\n",
    "criterion = nn.NLLLoss()\n",
    "loss_sum = 0\n",
    "all_losses = []\n",
    "plot_every = 100\n",
    "for e in range(epoch):\n",
    "    for ind, (title_tensor, label) in enumerate(tqdm(train_data)):\n",
    "        output, loss = train(rnn, criterion, title_tensor, label)\n",
    "        loss_sum += loss\n",
    "        if ind % plot_every == 0:\n",
    "            all_losses.append(loss_sum / plot_every)\n",
    "            loss_sum = 0\n",
    "    c = 0\n",
    "    for title, category in tqdm(test_data):\n",
    "        output = evaluate(rnn, title)\n",
    "        topn, topi = output.topk(1)\n",
    "        if topi.item() == category[0].item():\n",
    "            c += 1\n",
    "    print('accuracy', c / len(test_data))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:34:02.972596Z",
     "start_time": "2020-08-20T13:33:58.836172Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|█████████████████████████████████████████████████████████████████████████████| 2133/2133 [00:04<00:00, 517.41it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy 0.992498827941866\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "c = 0\n",
    "l1 = []\n",
    "l2 = []\n",
    "for title, category in tqdm(test_data):\n",
    "    output = evaluate(rnn, title)\n",
    "    topn, topi = output.topk(1)\n",
    "    l1.append(topi.item())\n",
    "    l2.append(category[0].item())\n",
    "    if topi.item() == category[0].item():\n",
    "        c += 1\n",
    "print('accuracy', c / len(test_data))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:34:12.363857Z",
     "start_time": "2020-08-20T13:34:12.348897Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0]\n",
      "[1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0]\n"
     ]
    }
   ],
   "source": [
    "print(l1[:40])\n",
    "print(l2[:40])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:34:24.323156Z",
     "start_time": "2020-08-20T13:34:24.315177Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1046"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sum(l1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:34:27.957712Z",
     "start_time": "2020-08-20T13:34:27.946694Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1062"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sum(l2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:28:46.089108Z",
     "start_time": "2020-08-20T13:28:42.250574Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|█████████████████████████████████████████████████████████████████████████████| 2133/2133 [00:03<00:00, 559.48it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy 0.992498827941866\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "c = 0\n",
    "for title, category in tqdm(test_data):\n",
    "    output = evaluate(rnn, title)\n",
    "    topn, topi = output.topk(1)\n",
    "    if topi.item() == category[0].item():\n",
    "        c += 1\n",
    "print('accuracy', c / len(test_data))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T12:40:55.234732Z",
     "start_time": "2020-08-20T12:40:55.061197Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x12b9a88db50>]"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.ticker as ticker\n",
    "\n",
    "plt.figure(fsize=(5,5))\n",
    "plt.plot(all_losses[1:])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:01:52.495244Z",
     "start_time": "2020-08-20T13:01:52.303270Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x12b9a780d90>]"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmMAAAGbCAYAAACI4ZeUAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAABaFElEQVR4nO3dd3ib5bk/8O+tZVtekrfj7cRZZBZnQgaQQBJa6KBsSscpbU9b4PTXUjpOT083dJ+WDmhp6QDKKJA2YSSQQAJkOCRkDye2YyeO954az+8PScZJPCRZr17Z+n6uKxeW9Ep6gsD++nnu535EKQUiIiIi0odB7wEQERERRTOGMSIiIiIdMYwRERER6YhhjIiIiEhHDGNEREREOjLpPYBApaWlqcLCQr2HQURERDSqPXv2NCql0ke6ZtyFscLCQpSVlek9DCIiIqJRiUjVaNdwmZKIiIhIRwxjRERERDpiGCMiIiLSEcMYERERkY4YxoiIiIh0xDBGREREpCOGMSIiIiIdMYwRERER6YhhjIiIiEhHDGNEREREOmIYIyIiItIRwxgRERGRjhjGiIiIiHTEMEZERESkI4axC3T2OXH4bDt6HS69h0JERERRgGHsAttPNGDd/23DyYZOvYdCREREUYBh7AI2qwUA0Nbt0HkkREREFA0Yxi5gs5oBAC0MY0RERBQGDGMXsHtnxlq6+3UeCREREUUDhrEL+GbGWhnGiIiIKAwYxi4QYzLCajFymZKIiIjCgmFsCHarhcuUREREFBYMY0OwWc3cTUlERERhwTA2BJvVzJkxIiIiCguGsSHYrBa0cmaMiIiIwoBhbAh2zowRERFRmDCMDcFutaCtxwG3W+k9FCIiIprgGMaGYLNa4FZAey+XKomIiEhbDGNDsPNIJCIiIgoThrEhsAs/ERERhQvD2BBs3vMpuaOSiIiItMYwNgQeFk5EREThwjA2BNaMERERUbgwjA0hKdYMg7BmjIiIiLTHMDYEg0GQHMfGr0RERKQ9TcOYiKwRkWMiUi4i9w9zzY0iclhEDonI41qOJxA8EomIiIjCwaTVC4uIEcBDAFYDqAGwW0TWK6UOD7qmBMDXAFymlGoRkQytxhMom9XMMEZERESa03JmbCGAcqXUKaVUP4AnAVx/wTWfBvCQUqoFAJRS9RqOJyB2q4XLlERERKQ5LcNYDoDqQbdrvPcNNhXAVBF5U0R2iMgaDccTEM6MERERUThotkwZwPuXAFgJIBfAGyIyWynVOvgiEbkLwF0AkJ+fH5aBcWaMiIiIwkHLmbEzAPIG3c713jdYDYD1SimHUqoCwHF4wtl5lFIPK6VKlVKl6enpmg14MLvVjO5+F/qcrrC8HxEREUUnLcPYbgAlIlIkIhYANwNYf8E1z8MzKwYRSYNn2fKUhmPyW7K3C38blyqJiIhIQ5qFMaWUE8AXALwM4AiAp5RSh0TkOyJynfeylwE0ichhAFsAfEUp1aTVmALBLvxEREQUDprWjCmlNgLYeMF93xr0tQLwJe+fiMLzKYmIiCgc2IF/GDbvzBiPRCIiIiItMYwN472ZMS5TEhERkXYYxobBZUoiIiIKB4axYcSaDbCYDNxNSURERJpiGBuGiMBuNXNmjIiIiDTFMDYCTxd+zowRERGRdhjGRuA5n5IzY0RERKQdhrERcGaMiIiItMYwNgKb1cKZMSIiItIUw9gIPMuUDngOCiAiIiIKPYaxEditZjjdCp19Tr2HQkRERBMUw9gIbN7Gr62sGyMiIiKNMIyNgF34iYiISGsMYyOwew8L545KIiIi0grD2AjeW6bkzBgRERFpg2FsBDbfzFgXwxgRERFpg2FsBLY4Txhr7eEyJREREWmDYWwEJqMBibEm7qYkIiIizTCMjcJzJBKXKYmIiEgbDGOjsFvN3E1JREREmmEYGwXPpyQiIiItMYyNwmY1c5mSiIiINMMwNgq71cICfiIiItIMw9gobFYzOnqdcLrceg+FiIiIJiCGsVH4zqdkrzEiIiLSAsPYKHxd+FnET0RERFpgGBuFb2aM7S2IiIhICwxjo+D5lERERKQlhrFRsGaMiIiItMQwNgrWjBEREZGWGMZGkRBjgskgrBkjIiIiTTCMjUJEeCQSERERaYZhzA92qxktXZwZIyIiotBjGPOD3Wrh+ZRERESkCYYxPyRbzWjjbkoiIiLSAMOYH+xWM2fGiIiISBMMY37wLFM6oJTSeyhEREQ0wTCM+cFmtaDf6UaPw6X3UIiIiGiCYRjzg913JBJ7jREREVGIMYz5weY7LJznUxIREVGIMYz5wXckEndUEhERUagxjPnBd1g4d1QSERFRqDGM+YE1Y0RERKQVhjE/+GrGWlkzRkRERCHGMOYHi8mAeIuRM2NEREQUcgxjfrJZLWhlzRgRERGFGMOYn2w8EomIiIg0oGkYE5E1InJMRMpF5P4hHv+4iDSIyD7vn//QcjxjYbda0MrWFkRERBRiJq1eWESMAB4CsBpADYDdIrJeKXX4gkv/oZT6glbjCBWb1YwzrT16D4OIiIgmGC1nxhYCKFdKnVJK9QN4EsD1Gr6fpjyHhXOZkoiIiEJLyzCWA6B60O0a730X+oiI7BeRZ0Qkb6gXEpG7RKRMRMoaGhq0GOuo7FYz2noccLmVLu9PREREE5PeBfz/AlColJoDYBOAx4a6SCn1sFKqVClVmp6eHtYB+tisFigFtLNujIiIiEJIyzB2BsDgma5c730DlFJNSqk+780/ALhUw/GMiW2gCz+XKomIiCh0tAxjuwGUiEiRiFgA3Axg/eALRCR70M3rABzRcDxj4jufkjsqiYiIKJQ0202plHKKyBcAvAzACOBRpdQhEfkOgDKl1HoAd4vIdQCcAJoBfFyr8YyVb2aMjV+JiIgolDQLYwCglNoIYOMF931r0NdfA/A1LccQKr6ZsZYuzowRERFR6OhdwD9uDIQxzowRERFRCDGM+Skx1gSDAK08LJyIiIhCiGHMTwaDIDmO51MSERFRaDGMBYDnUxIREVGoMYwFwGY1czclERERhRTDWADsVgt3UxIREVFIMYwFwGa1cGaMiIiIQophLAB2qxkt3E1JREREIcQwFgCb1Ywehwu9DpfeQyEiIqIJgmEsADZv49c27qgkIiKiEGEYCwC78BMREVGoMYwFwO49LJw7KomIiChUGMYC4Fum5I5KIiIiChWGsQDY470zY9xRSURERCHCMBYAWxxrxoiIiCi0GMYCEGcxIsZk4G5KIiIiChmGsQB5jkTizBgRERGFBsNYgGzswk9EREQhxDAWIDvPpyQiIqIQYhgLkD3ezAJ+IiIiChmGsQAlx1nQymVKIiIiChGGsQDZrWa09jiglNJ7KERERDQBMIwFyG61wOVW6Ohz6j0UIiIimgAYxgJk855P2crzKYmIiCgEGMYCZLeyCz8RERGFDsNYgN47n5JhjIiIiMaOYSxAyd7zKbmjkoiIiEKBYSxAditnxoiIiCh0GMYClBznLeDnzBgRERGFAMNYgExGA5JiTTwSiYiIiEKCYSwI9ngLDwsnIiKikGAYC4LNamHNGBEREYUEw1gQbHFm1owRERFRSDCMBcFuNXNmjIiIiEKCYSwINqsFbZwZIyIiohBgGAuC3WpBR58TDpdb76EQERHROMcwFgTfkUisGyMiIqKxYhgLgs3qOxKJdWNEREQ0NgxjQbDF+Y5E4swYERERjQ3DWBDs3pkx7qgkIiKisWIYC4LNe1g4d1QSERHRWDGMBcEez5kxIiIiCg2GsSDEW4wwG4U1Y0RERDRmDGNBEBHYrBbupiQiIqIxYxgLki2ORyIRERHR2DGMBclutXCZkoiIiMaMYSxINquZuymJiIhozDQNYyKyRkSOiUi5iNw/wnUfERElIqVajieUPDNjXKYkIiKisdEsjImIEcBDANYCmAngFhGZOcR1iQDuAbBTq7FowRZvRmu3A0opvYdCRERE45iWM2MLAZQrpU4ppfoBPAng+iGu+y6ABwD0ajiWkLNbLeh3udHd79J7KERERDSOaRnGcgBUD7pd471vgIi8D0CeUmrDSC8kIneJSJmIlDU0NIR+pEF473zK0Zcqd55qwi0P78DJhk6th0VERETjjG4F/CJiAPAzAP9vtGuVUg8rpUqVUqXp6enaD84PNu/5lK0jFPErpfDH7RW49Q878fapJvzznZpwDY+IiIjGCS3D2BkAeYNu53rv80kEMAvAVhGpBLAYwPrxUsRvt448M9bd78TdT+7Dd/99GFdNz8CsnCRsP9EYziESERHROKBlGNsNoEREikTEAuBmAOt9Dyql2pRSaUqpQqVUIYAdAK5TSpVpOKaQ8Z1POdTMWEVjFz700FvYsP8s7lszDb+7/VKsmpGJ/Wfa2LWfiIiIzqNZGFNKOQF8AcDLAI4AeEopdUhEviMi12n1vuFi886MXRiuNh2uw3W/2o76jl785ZOL8J8rp8BgECwrSYNSwFsnm/QYLhEREUUok5YvrpTaCGDjBfd9a5hrV2o5llCzxXlmxnxd+F1uhZ9vOo5fbynH7Jxk/Pb29yHXbh24fm6uDYkxJmw70YB1s7N1GTMRERFFHk3D2ERmMRmQEGNCS3c/Wrr6cfeTe7HtRCNuKs3D/15/CWLNxvOuNxkNWDw5FdtONEIpBRHRaeREREQUSUZdphSRySIS4/16pYjcLSI2zUc2DiTHmbGvuhXv/9V27DzVjB9+eDYeuGHORUHMZ1lJGmpaelDV1B3mkRIREVGk8qdm7FkALhGZAuBheHZIPq7pqMYJe7wZe0+3QimFpz67BLcszB/x+mUlnrYc28q5q5KIiIg8/Aljbm8x/ocA/Eop9RUALHoCcOX0TKy5JAv/+uLlmJdnG/X6wlQrcmxx2H4iMhrXEhERkf78qRlziMgtAO4E8AHvfWbthjR+fGn11ICuF/HsqtywvxZOlxsmo249d4mIiChC+JMGPgFgCYDvK6UqRKQIwF+1HdbEdXlJGjr6nHi3pk3voRAREVEEGDWMKaUOK6XuVko9ISJ2AIlKqQfCMLYJ6bLJaRABu/ETERERAP92U24VkSQRSQHwDoBHRORn2g9tYrLHWzA7Jxnby1k3RkRERP4tUyYrpdoBfBjAX5RSiwCs0nZYE9vlU9LwzulWdPQOf8g4ERERRQd/wphJRLIB3Ajg3xqPJypcXpIGl1thx6lmvYdCREREOvMnjH0HnvMlTyqldotIMYAT2g5rYru0wI44s5EtLoiIiGj01hZKqacBPD3o9ikAH9FyUBNdjMmIRcUpbP5KREREfhXw54rIcyJS7/3zrIjkhmNwE9nlU9JwqqELZ1p79B4KERER6cifZco/AVgPYJL3z7+899EY+I5G4lIlERFRdPMnjKUrpf6klHJ6//wZQLrG45rwpmYmICMxBtvYb4yIiCiq+RPGmkTkdhExev/cDqBJ64FNdCKCy0vS8NbJJrjdSu/hEBERkU78CWOfhKetxTkAtQBuAPBxDccUNZaVpKG5qx+Ha9v1HgoRERHpxJ/jkKqUUtcppdKVUhlKqQ8CuEf7oU18l01JAwC8wboxIiKiqOXPzNhQbgzpKKJURmIspmcl8pxKIiKiKBZsGJOQjiKKLStJQ1llC3r6XXoPhYiIiHQwbBgTkZRh/qSCYSxkLi9JR7/LjV2VPBqJiIgoGo3UgX8PAIWhg1e/NsOJPgsLU2AxGrDteANWTGXHECIiomgzbBhTShWFcyDRKs5iRGmhHdt5NBIREVFUCrZmjEJoWUk6jp7rQH1Hr95DISIiojBjGIsAy0o8LS7e5OwYERFR1GEYiwAzs5OQEm/BtuMMY0RERNHGrzAmIpeLyCe8X6eLCOvJQshgECydnIrt5Y1QikcjERERRZNRw5iI/A+ArwL4mvcuM4C/aTmoaLS8JB31HX04Xtep91CIiIgojPyZGfsQgOsAdAGAUuosgEQtBxWNLvfWjW3j0UhERERRxZ8w1q88a2cKAEQkXtshRadJtjgUp8ezxQUREVGU8SeMPSUivwdgE5FPA9gM4BFthxWdlk1Jw45TTehz8mgkIiKiaDFqGFNK/QTAMwCeBTANwLeUUr/SemDR6PKSdPQ63NhT1aL3UIiIiChMRjoOaYBSahOATRqPJeotLk6BySDYfqIRSyen6T0cIiIiCgN/dlN2iEj7BX+qReQ5ESkOxyCjRWKsGfPzbXj9OIv4iYiIooU/NWO/APAVADkAcgF8GcDjAJ4E8KhmI4tS187OxqGz7SirbNZ7KERERBQG/oSx65RSv1dKdSil2pVSDwO4Rin1DwB2jccXdW5ckIeUeAt+s/Wk3kMhIiKiMPAnjHWLyI0iYvD+uRGA70RrtosPMavFhE9eVojXjtbj8Nl2vYdDREREGvMnjN0G4A4A9QDqvF/fLiJxAL6g4dii1h1LCpEQY8JvX+fsGBER0UTnT2uLU0qpDyil0pRS6d6vy5VSPUqp7eEYZLRJjjPj9sUF2LD/LCobu/QeDhEREWnIn92UsSLyeRH5jYg86vsTjsFFs09eXgiT0YDfv8HZMSIioonMn2XKvwLIAnANgNfh2VHZoeWgCMhIjMVNpXl4Zk8NzrX1jv4EIiIiGpf8CWNTlFL/DaBLKfUYgGsBLNJ2WAQAdy0vhlsBj2w7pfdQiIiISCP+hDGH95+tIjILQDKADO2GRD55KVZcP3cSHt95Gi1d/XoPh4iIiDTgTxh7WETsAL4JYD2AwwAe0HRUNOBzKyejx+HCn96q1HsoREREpIERw5iIGAC0K6ValFJvKKWKlVIZSqnfh2l8Ua8kMxFXz8zEY29VorPPqfdwiIiIKMRGDGNKKTeA+8I0FhrGf14xBW09Djy+s0rvoRAREVGI+bNMuVlEviwieSKS4vuj+chowLw8Gy6bkoo/bKtAr8Ol93CIiIgohPwJYzcB+DyANwDs8f4p8+fFRWSNiBwTkXIRuX+Ixz8rIgdEZJ+IbBeRmYEMPpp8fuUU1Hf04dl3avQeChEREYWQPx34i4b4Uzza80TECOAhAGsBzARwyxBh63Gl1Gyl1DwADwL4WeB/heiwZHIq5ubZ8LvXT8Lpcgf03K3H6vF/r56AUjxKlIiIKNL404HfKiLfFJGHvbdLROT9frz2QgDl3uOU+gE8CeD6wRcopQafhB0PHjw+LBHB51dORnVzDzYcqPXrOe29Dnz1mf34+J9242ebjmN7eaPGoyQiIqJA+bNM+ScA/QCWem+fAfA9P56XA6B60O0a733n8R61dBKembG7h3ohEblLRMpEpKyhocGPt56YVs3IxNTMBPxmy0m43SPn1m0nGrDm52/g6T3V+MyKYqQlWPDnNyvDM1AiIiLymz9hbLJS6kF4m78qpboBSKgGoJR6SCk1GcBX4ellNtQ1DyulSpVSpenp6aF663HHYBB8buVkHKvrwGtH64e8prPPia8/dwB3/HEXYi1GPPu5pfja2hm4dVEBXjtWz4PHiYiIIow/YaxfROLgXUIUkckA+vx43hkAeYNu53rvG86TAD7ox+tGtQ/MmYRcexx+vaX8ohqwt042Ys0v3sATu07j08uKsPHuZZifbwcA3L4oH0YR/OVttscgIiKKJP6EsW8DeAlAnoj8HcCr8K/32G4AJSJSJCIWADfD08F/gIiUDLp5LYAT/gw6mpmMBnxmxWTsq27F26eaAADd/U58e/0h3PrITpgMgqc/swTfuHYmYs3GgedlJMXi2jnZeLqsms1jiYiIIohptAuUUq+IyB4Ai+FZnrxHKTVqJbhSyikiXwDwMgAjgEeVUodE5DsAypRS6wF8QURWwbME2gLgzjH8XaLGRy/NxS83n8Bvt56E2WjAV55+F5VN3fj40kJ8dc10xFmMQz7v40sL8cK+s3h2Tw3uXFoY3kETERHRkGS0dgci8i8AjwNYr5TSveCotLRUlZX51eZsQvvd6yfxoxePQgTItcfhxzfMxeLi1FGf98GH3kR7jwObv7QCBkPwpX8n6jrwi80n8KOPzEZirDno1yEiIprIRGSPUqp0pGv8Wab8CYBlAA6LyDMicoOIxIZkhBS02xblY2Z2Em5fVICX7lnuVxADgE9cVohTjV1440Twu1LdboX7/3kAGw7U4qWD54J+HSIiIvKv6evrSqn/BFAM4PcAbgQw9FY+CpvEWDM23rMM3/3gLMTHjLraPGDtrGykJ8bgz29VBv3e/9x7BnuqWmAyCMMYERHRGPkzMwbvbsqPAPgsgAUAHtNyUKQdi8mA2xcVYOuxBpxq6Az4+W09DvzoxSOYn2/DHUsKsO1EIzcEEBERjYE/HfifAnAEwJUAfg1P37Evaj0w0s6ti/JhMRqCanPx803H0dTVj+9ePwvrZmej3+UetucZERERjc6fmbE/whPAPquU2gJgqYg8pPG4SEPpiTF4/1xPm4v2XoffzztS246/vF2J2xblY1ZOMi7NtyM9MQYvHfTveCYiIiK6mD81Yy8DmCMiD4pIJYDvAjiq9cBIW59YWoSufheeKavx63qlFL71wkEkx5nx5aunAfCcCHD1zExsOdqAnn6XlsMlIiKasIYNYyIyVUT+R0SOAvgVPOdMilLqCqXUr8I2QtLE7NxkXFpgx2NvV456ziUAPL/vDHZXtuCra6bDZrUM3L92VjZ6HC68fjx6zwwlIiIai5Fmxo7CUyf2fqXU5d4AxumPCeTjSwtR1dSNrcdHrvlq73XgBxuPYm6eDTeW5p332KLiFNisZi5VRqg9Vc3YsJ+fDRFRJBspjH0YQC2ALSLyiIhchRAeEE76WzMrC1lJsfjTm5UjXveLTSfQ2NmH715/yUWNYs1GA1bPyMSrR+rR52RWjzS/eq0c9z+7H06XW++hEBHRMIYNY0qp55VSNwOYDmALgHsBZIjIb0Xk6jCNjzRkNhoG2lOU13cMec3Rc+147O1K3LIwH3NybUNes3Z2Fjr6nHirvEnD0VIwqpq60dHnxOHadr2HQkREw/CngL9LKfW4UuoDAHIB7AXwVc1HRmFx84I8WEyGIZvAeor2DyEx1oSveIv2h3LZlDQkxpjwIpcqI4rT5UZNSzcAYMcpBmUiokjlV9NXH6VUi1LqYaXUVVoNiMIrNSEG18+dhGf3nEFbz/ltLta/exa7Kppx3zXTYY+3DPMKQIzJiCtnZGDT4Touh0WQ2rZeOFyezRk7TzXrPBoiIhpOQGGMJqY7lxaix+HC02XVA/d19Drw/Q1HMCc3GTctyBvh2R5rZ2WhpduBnRX8oR8pKpu6AADF6fHYVdEMlx+7ZomIKPwYxgizcpKxsDAFj71dOfAD+/9ePYGGzj585/pZMBpG37exYmoG4sxGLlVGkMomzxLlzQvy0NHnxBHWjRERRSSGMQIAfOKyQlQ39+C1o/U4UdeBP71ZiZtK8zAvz+bX8+MsRqyclo6XD9X51beMtFfV2IVYswHXzc0BwLoxIqJIxTBGAIDVMzMxKTkWf3qzAt964RDiY0y4b830gF5jzawsNHT0Yc/pFo1GSYGobOpGQUo8spJjUZQWzzBGRBShGMYIAGAyGnDHkkK8dbIJb59qwpevmYaUEYr2h3Ll9AxYjAa8eOCcRqOkQFQ1dSE/1QoAWFycwroxIqIIxTBGA25ekIdYswGzcpJw68L8gJ+fGGvGspI0vHzoHJTiD309ud0Kp5u7UegNY4uKUtHey7oxIqJIxDBGA+zxFjzx6cV4+I5Sv4r2h7JmVhbOtPZgf01biEdHgajr6EWf042C1HgAnmOrAHC3KxFRBGIYo/PMz7djki0u6OevnpkJk0Hw4kEuVeqpstGzk7LQG8ayk+NQkGpl3RgRUQRiGKOQslktWDI5FS8drOVSpY6qvD3GCrzLlACwuCgVuyqauduViCjCMIxRyK2ZlYXKpm4cPTf0eZekvcqmbpiNct4s56LiFLT1OPi5EBFFGIYxCrmrZ2ZBBFyq1FFVUxfy7Nbzav8WFacCYL8xomAopXCqoZMzy6QJhjEKufTEGCwoTMFL7Mavm6qm7vOWKAEgxxaH/BQrdlYwjBEFaldFM6786etY/fPX8dTuavQ5XXoPiSYQhjHSxJpLsnC8rhMnGzr1HkrUUUqhqqlrYCflYIuKUrCTdWNEAfOd9aoUcN+z+7HsgS343esn0d7r0HlkNBEwjJEm1szKAgC8xKXKsGvs7EdXv2ugx9hgi4tT0drtwPF61o0RBaKhow8AsPGeZfjrpxZiamYifvTiUSz94Wv44cYjONfWq/MIaTxjGCNNTLLFYW6ejQeH62BgJ2XaEDNj3n5jO05yqZIoEI2d/UiKNSHWbMSyknT87T8W4d9fvBxXTM/AI9tOYdmDr+ErT7+LE3X8RYcCZ9J7ADRxrZ2VhR+9eBTVzd3IS7l4loa0Udl0fo+xwXLtVuTa47Czohkfv6wo3EMjGrcaOvqQlhhz3n2zcpLxq1vm475rpuGP2yvw5O7TeHpPDa6anoErpmegz+lGr8OFnn4XehyeP72Dvu7pd0EB+NGHZ6M4PUGfvxhFBIYx0owvjL108Bw+vbxYlzH0Oly45ZEd+K9VU7F8arouYwi3qqYuGMRTsD+URUWp2HKsHm63giHIkxaIok1DRx/SE2KGfCwvxYpvX3cJ7r6qBH99uwqPvV2JV4/WDzxuECDObEScxYhYs3Hga7PRgD1VLdhe3sgwFuUYxkgzBanxmJGdhBcP1uoWxvaebsXe0614ek9NFIWxbuTY42AxDV2FsLg4Bc++U4MT9Z2YlpUY5tERjU+NnX2YOSlpxGtS4i24Z1UJPruyGM1d/bCaTYi1GGAxGiBy8S8+SinM+NZLqG7u1mrYNE6wZow0tXZWFt453apbcesu71mM2040wBUlOwirmrqGXKL0WeztN8YWF0T+a+joQ9owM2MXijEZkZ0ch2SrGTEm45BBDABEBLl2K2paekI5VBqHGMZIU2u9uypfPqTPrspdlU0QAVq7HThwJjoOL68cosfYYLn2OOTY4tj8lchPPf0udPQ5kZ7oXxgLRK49DtUtnBmLdgxjpKmSzERMTo/HpsN1YX/vfqcbe6pacN3cSRAB3jjeEPYxhFtrdz/aehwjzoyJCBYVp2DnqWaeH0rkh8ZOT1sLLcJYHmfGCAxjFAbLStKxu7I57B2rD5xpQ6/DjTWXZGF2TnJUhDHfTsqhGr4OtrgoFU1d/SivZ1NeotE0aBjGcu1xaO12oIPNY6MawxhpbsnkVPQ53Xi3OrzLhL56sYVFKVgxNR17q1vR1hOab3hPl1Xj0NnIW/b09RgbquHrYL66sR3ef0dENDxfw9fhdlOOha/tD2fHohvDGGluUVEKRIC3w9xodFdFE6ZkJCA1IQbLp6bD5VZ4q7xxzK9b39GL+57dj4e2lIdglKFV5Z0ZG62vW15KHLKTY1k3RuSHgTCm0cwYAO6ojHIMY6Q5m9WCGVlJYf3B73IrlFW2YGGRp+P8vDwbEmNMeOPE2JcqXzp4DkoB+063jvm1Qq2yqQvZybGINRtHvE5EsLg4FTtPNbFujGgUjZ19EPG0rgi1PLvnF6dqzoxFNYYxCovFxanYc7oFvY7w1I0dqW1HR58Ti7xhzGw0YOmUVLxxvHHM4WPDfs8RT2fbelHXHlnn0VWNspNysEVFKWjs7MfJhi6NR0U0vjV09MFutcBsDP2PTJvVjHiLETXcURnVGMYoLJZMTkW/04191a1heb+dg+rFfFZMzcCZ1h6cbAi+aL2+vRe7KpsHGsjujbDZsdF6jA02UDfGpUqiEY3UfX+sRAR5KVZUN3NmLJoxjFFYLCwMb93YzlNNyE+xIjv5vSOBlk9NAwC8fjz4urGXDnmWKO+7ZhrMRglbuPRHR68DjZ39o+6k9ClItSIrKXYguBLR0Bo7+zSpF/PJtcdxZizKMYxRWCRbzbhkUnjqxtxuhd2VzefNigGeQ7KL0+PH1OLi3/trMTUzAbNykjEjOwn7qlvGOtyQqRo4INy/ZUpfv7EdrBsjGlFDZx/SEkJfL+bj68LP/w+jF8MYhc2S4lTsPd2qed1YeUMnWrodA/Vigy0vScfOiqagxlDf3ovdlc1YNzsbADA/z4b9NW0Rc8zSae9urHw/wxjgWaps6OjDqUbWjRENRSnlWabUeGass88ZstY7NP4wjFHYLC5ORb/LjXdOazub5Ft2W1SUetFjK6alo9fhHuhBFogXvbsor/WGsXn5NnT3u3C8rmNsAw6RSm+PMX+XKQEMBNadp7hUSTSUzj4neh1uTcOYrxUN68aiF8MYhc2CohQYBNihcd3YzlNNyEqKRV5K3EWPLS5KhcVkCGqpcsMBzxJlSWYiAGBenh0AIqZurKqxG2kJMUiIMfn9nKK0eGQkxrCIn2gYjZ39ALTpMebj6zXGurHoxTBGYZMUa8asnGTs0HAWRimFXRWeejERuejxOIsRCwtTAu435luivHb2pIH7ClOtsFnN2KvxTJ+/Kpu6/K4X8/HUjaViZwXrxoiG4mv4mqbRbkrAUzMGgAeGRzGGMQqrJcWp2Fvdgp5+berGqpq6Ud/Rh0XFF9eL+SyfmobjdZ2obfN/SWBgiXJO1sB9IoJ5ebbImRlr6g5oidJncXEK6tr7Bs61JKL3aNl93yc5zoykWBOPRIpiDGMUVouLU+FwKc3qxnYN1IsNH8ZWTM0AgICWKjfsr8W0zERMyUg87/55eTacqO/U/ZDfXocL59p7A54ZA96rrdvJpUqiizR2ancu5WCeXmP8hShaaRrGRGSNiBwTkXIRuX+Ix78kIodFZL+IvCoiBVqOh/RXWmiH0SCa9RvbUdGE1HgLJqcnDHvN1MwEZCXF4g0/+43Vtfdid9V7uygHm59vh1LA/hp9Dw0PZielz+T0eKQlsG6MaCgNHX0wGgR2q3atLQBfrzHOjEUrzcKYiBgBPARgLYCZAG4RkZkXXLYXQKlSag6AZwA8qNV4KDIkDtSNafODf6R6MR8RwbKSNGwvb/SrLcWLB2ovWqL0mZdrA6B/EX+ltzWFv933B/OcU5mCHaeaWTdGdIGGjj6kxltgMAz/PSUU8thrLKppOTO2EEC5UuqUUqofwJMArh98gVJqi1LKNy+7A0CuhuOhCLGkOBXv1rSiu98Z0tc909qDmpaei5q9DmX51HS09Tjwbk3rqNduODD0EiXgaWZbnBav+7FI7zV8DTyMAcCi4lSca+8dmGEjIg+tu+/75Nrj0ONwoamrX/P3osijZRjLAVA96HaN977hfArAi0M9ICJ3iUiZiJQ1NATfPZ0iw+LiFDhcCnuqQls3tnuI8yiHc/mUNBhk9Lqxc229KKtqwbVzLl6i9JmXb8O+6hZdf6OtbOqCzWpGstUc1POXeDc8vFnOpUqiwTzd97UPY+/1GuMvRNEoIgr4ReR2AKUAfjzU40qph5VSpUqp0vT09PAOjkJuQWGKJnVjOyuakBhrwvSspFGvtcdbMCfXhtdHCWMvHvQsUQ5VL+YzP8+Gxs5+Xes9gt1J6TM5PQF5KXF4+dC5EI6KaPzTuvu+j6+9BevGopOWYewMgLxBt3O9951HRFYB+AaA65RSfRqOhyJEfIwJc3JDXze2s6IZC71Bzx/Lp6bj3epWtHUPvxNy44FaTM9KxJSM4TcERELz12B6jA0mIlg3OxtvljeitZvLJESAp29hOJcpAfYai1ZahrHdAEpEpEhELABuBrB+8AUiMh/A7+EJYvUajoUizJLiVOyvaUNXX2jqxho6+nCqocuvJUqfFVPT4FbA9vKhd1Wea+vF7sqWEWfFAGB6diJiTAbd6sb6nW6cbe1BQUrwYQzwHPPkdCtsOlwXopERjW9tPQ44XCosy5TxMSakxFs4MxalNAtjSikngC8AeBnAEQBPKaUOich3ROQ672U/BpAA4GkR2Sci64d5OZpgFhenwulWKAtR3djuSv/rxXzm5tqQFGsatm7sxYO1AEZeogQAs9GA2TnJ2FetTyf+mpZuuFVgZ1IOZXZOMnLtcdh4oDZEIyMa38LR8HWwPHsca8ailP+H2AVBKbURwMYL7vvWoK9Xafn+FLlKC+0weevGVkwdex3gzlNNsFqMmJWT7PdzTEYDLi9Jw+vHG6CUuqgdxob9oy9R+szLs+EvO6rQ73TDYgpvKebATsq0sc2M+ZYq//RmBdp6HEiOC24zANFEMRDGwjAzBnjqxo7UtoflvSiyREQBP0Ufq8WEuXm2kNWN7axoxqUFdpiNgf0nvbwkHefae3GivvO8+wd2UY4yK+YzP9+Ofqdbl2+klU2eHmNjnRkDgLWzsuBwKWzmUiURGjrDOzOWm+Jp/Or2o/8hTSwMY6SbJcWpOHCmDZ1jrBtr7e7HsboOLCz0f4nSZ7l3Vu7CpUrfUt26EVpaDDYv3wZAnyL+qqZuJMSYkBo/9g7h8/JsmJQcy6VKIugzM9bvcg+EQIoeDGOkm8XFqXC51UC9V7DKKlugVGD1Yj6TbHEoyUi4qMWFbxflSMcqnfc6ybHISIwZUxj7w7ZTeHLX6YCfV9nUhYJU64inDvhLRLB2dja2nWhEu87nbRLpraGzDxajAUlxmlb0DMjz7ahk3VjUYRgj3XiWFQU7xthvbGdFEywmA+bm2YJ6/vKp6dhZ0YyefhcAoLatJ6AlSsATYubl2bA3yAPQ6zt68cBLR/G9DUcCnik83dSNgjG0tbjQutnZ6He58eoRLlVSdGvs6Ed6YkxIftHxh6/XGNtbRB+GMdJNnMWIeSGoG9tV0Yx5eTbEmo1BPX/51HT0O93YWeEZx4sHPI1P/V2i9JmXb0NlUzdagjjO5Mld1XC4FDr7nPjnOzV+P8/pcqO6ZWwNXy80P8+GrKRYbDzABrAU3Tzd97U9IHwwX6+xmma2t4g2DGOkK1/dWLBLYp19Thw8245FQSxR+iwqSkGMyYA3jnv6jW0IcInSZ76v+asf510O5nC58fedVVhWkoa5eTb8+a1Kvwt4a9t64XCpMTV8vZDBIFg7OwuvH29AB5cqKYqFq/u+T6zZiPTEGM6MRSGGMdLV4uJUuBVQFmTd2J6qFrjcKqh6MZ9YsxGLilPxxokG1Lb1YE9VC94f4KwYAMzJTYZBEHDz11cO1aGuvQ93LinEJ5YW4lRDF7YN04j2QqHcSTnYutnZ6He68drRsfViPtXQyUBH41a4wxjgqRtj49fowzBGunpfgR0WoyHocyp3VTTBZBBcWmAf0ziWl6ShvL4Tf9hWAWD0Rq9DiY8xYWpmYsBF/I+9XYlcexyumJ6BdbOzkZ4Ygz+/WeHXcyt9PcZCHMYuzbcjIzFmTLsqz7T2YO0vt+GnrxwP4ciIwsPlVmjuCs8h4YPlpVg5MxaFGMZIV7FmI+bl27DjVHAzY7sqmjErJxlWy9h2O/kaz/75rUrMyE5CcYBLlD7z8214t7rV72XGI7Xt2FXRjDsWF8BoEFhMBty2KB9bjjWgorFr1OdXNXYh1mxARoh/ezcYBGtnZWHrsYagj6z66cvH0Od0h/xAeKJwaO7qh1uFr8eYT649DrWtvXC63GF9X9IXwxjpbklxKg6dbUNbT2DLWb0OF96tbhtTvZjPlIwEZCfHwuVWuHZ2VtCvMy/PhrYeByqaRg9SAPCXt6sQYzLgpgV5A/fduigfZqPgL29Xjvr8quZu5KdYYfDzcPRArJudjb4glyoPnmnDc/vOIC0hBsfqOoLa1ECkp3D3GPPJs1vhdCuca+8N6/uSvhjGSHe+urHdFYHNju093Yp+lxuLiscexkRkYHYsmCVKn3m+In4/6sbauh14fu8ZfHBeDmzW93ZsZSTG4trZ2Xi6rGbUNhdVTV0hrxfzKS1MQXpizMAZnf5SSuFHLx6FLc6MBz4yGwBCdgYpUbg0hrn7vo+vvQXrxqILwxjpbn6+DRaTIeAWF7sqmiECXFow9jAGAJ+/Ygp+fMOcoJcoAc8MW0KMya+6saf3VKPH4cIdSwoueuzjlxWhs8+JZ/cM3+bC7VaoauoO6U7KwYwGwZpLsvDa0Xp09/u/VPnGiUZsL2/EF68swWVT0mAxGbCrgkuVNL74ZsbCXzPGxq/RiGGMdBdrNuLSfDveDjSMVTZhRlZSyA60zkux4qOleaNfOAKjQTAnNxl7q0eeCXK7Ff66owqlBfYhDzefl2fDvDwbHhuhzUVdRy/6nG7NZsYAzyxhr8ONLUcbRr8YnqLnH248gvwUK25fXOCpCcyzYVeAs55Eegv3uZQ+2clxEOHMWLRhGKOIsLg4FYdr29HW7V/dWL/TjT1VLWNqaaGVeXk2HK3tQK/DNew1r59oQFVTNz62tHDYaz6+tBCnGodvc1HZqM1OysEWFqUgLcGCjX4uVf7znRocPdeBr1wzDRaT59vLwsIUHDzbHvRGACI9NHb0wWoxIj4mPEch+VhMBmQnxXJHZZRhGKOIsGRyKpTCQBf80Rw404ZehxuLQ1AvFmrz8+1wuhUOnmkb9pq/vFWJ9MQYrLlk+M0Co7W5qBroMabNMiXgmem75pIsvHakfuC4qOH0Olz46SvHMTc3+bw+bQuLUuByK7wT5FFRRHrwdN8P76yYT67dypmxKMMwRhFhbl4yYkyGUVtcuN0Kpxo68XRZNQBgQWHkhbF53jMyh2v+WtnYha3HG3DrwvyB2aOhjNbmoqq5G2ajYJItLhTDHta62dnocbjw+vGRd1X+cXsFzrX34uvrZpx3lt/7CuwwGiRkS5XVzd0D9TxEWtGj4atPbkocalgzFlXCO/9KNIwYkxGlhRfXjTV19mFfdSverW7FXu8/23s9y12lBXak6vSb60jSE2OQY4sbtoj/bzuqYBTBrYvyR32tWxfl46Et5XjsrUp8+7pLznusqqkLeXYrjBq0tRhsUVEKUuIt2HDgHNbMGnqnaVNnH3679SRWzcjEouLU8x5LiDHhkklJIQljSil87NFdiDUbseGLl2vS0oMI8ISxQI9EC5VcuxXn2s+g3+ke8Rc2mjgYxihiLC5KxU83Hcdvt57EobNt2FfdOjBVbxBgWlYSrp0zCfPykjEvz44pGfp8o/TH/HzbkDNj3f1OPFVWjTWzspCZFDvq6/jaXDyzpwZfvmYaEgbVr1Q2dmu6ROljMhpwzSWZWL/vLHodriEPZP/Va+Xocbhw/9ppQ77GwsIU/GVHFfqcLsSYgjvQHQBO1HcOzBL+a/9ZXD8vJ+jXIhpJY2dfSNrmBCPPHge3AmrbejTdoEORg5GbIsYyb5+vB146ir2nWzE314avr5uOpz6zBAf/9xq8eM8y/PDDs3HTgnxMy0rUfEZoLObl2XCmtQf1FzRufGHfWbT3OnHnCIX7FxqqzYVSStMeYxdaNzsbXf0uvH784l2VlY1d+NuOKty0IA9TMhKHfP7CohT0O93YXzN8HZ0/Nh+pA+Cpk/vZpuNwsEs5aaDf6UZLtwPpCaP/wqQF9hqLPpwZo4gxL8+Gf3/xcmQkxSAjUZ9vgqEyP98GANhb3YprvEX6Sik85j1uqTSAszQHt7m4Y3EBDAZBY2c/uvpdmvUYu9Di4lTYrGa8eKB24O/j8+DLR2ExGXDvqpJhn++r7dtV0TymOr/Nh+swOycZ964qwaceK8NTZdW4bdHFfdqIxqKpS5+2Fj7sNRZ9ODNGEWVWTvK4D2IAcMmkZJiNcl7d2O7KFhw914E7lxScV+Duj09c5mlz8cYJz8zUwE7KtPDMjJmNBlwzMwubj9Sf17LjndMt2HjgHO5aXjzi52aPt2BqZsKY6sYaO/uwt7oVq2Zk4srpGSgtsOP/Xj0xYgsRomA0dniO70pLsIxypTaykmJhNAhnxqIIwxiRBmLNRszITsLeQe0cHnu7EkmxpqDqnNbO8ra5eKsSAFDV5PmNuSAlPDNjALBuTjY6+5zYfsLT90wphR9sOIL0xBh8elnxqM9fWJSCPVUtQR+A/NrReigFrJqZARHBfWumo669D495/50QhUpDp6e8QK+ZMZPRgEk29hqLJgxjRBqZn2fDgZo2uNwK59p68fLBc7hpQR7iLIEXsPvaXGz1trmoauqCQd6rLQmHpZNTkRxnxsYDngawrxyuQ1lVC/5r1VS/GmMuKExBZ58TR2o7gnr/zYfrMCk5FjOzkwB4wt3Kaen4zdaTAR8yTzSSgUPCdQpjAJBrY6+xaMIwRqSRefk2dPW7cKK+A4/vOg2XUrh9cfD1TbcuyofZKHjsrUpUNnUjxx4X1m3vZqMBV8/MxKYjdejud+KBF49iSkYCbizN9ev5vtMSdlUGvlTZ63Bh24lGXDUj87wl3i9fPQ1tPQ488sapgF+TaDiNnb5lSv3CWF5KHGvGogjDGJFG5uV5ivR3VTTj8Z2nccW0jDHtfsxIjMX750zCM3tqcOhsm6bHIA1n3exsdPQ6cfcT+3CqsQv3r5kOk9G/byPZyXHIT7EGdWj42yeb0ONw4aoZGefdPyvH0+3/0Tcr2AiWQqahow+JsaYh27iES67divqOPtZERgmGMSKNFKZaYbOa8evXytHY2YePLRn7rr87lxais8+Jkw1dYekxdqHLpqQhMdaEzUfqsLAo5aJwNJoFhSnYXdkCpYY+/Hw4m4/UId5ixJLJqRc99v+unoY+pxsPbSkP6DWJhqNn930f347KM61cqowGDGNEGhERzMuzob6jD4WpViwvSR/za/raXADaHhA+HIvJgNUzMwHgomOP/LGoKAXNXf042dDp93OUUth8pA7LStKHbBhblBaPG0tz8fedVVzWoZBo6OhDus6ne/jqQfnfdHRgGCPSkC843bGkMGRH93ziskIAQHG6Pp2577tmOv54Z+nA3y0QvrqxnQG0uDh4ph117X1Y5Q2BQ7n7qhIYRPCLzScCHhPRhRo7+5Cm98wYG79GFYYxIg19YO4krLkkCx/1s8jdr9ecMwl/+sQCrJga2BJhqGQlx+KqGcMHo5EUpFqRnhgTUL+xzUfqIAJcMW34mcXs5DjcubQQ/9xbg+N1we3WJPKJhJmxjMQYWIwGtreIEgxjRBqanJ6A391xKZJizSF7TYNBcMW0jIg+Dmo4IoKFRSnYVdHsd93Y5iN1uDR/9EPhP7diMhIsJvzk5WOhGCpFqV6HCx19Tt1rxgwGQY49jjNjUYJhjIjCalFRCmrbev36IVPb1oNDZ9tHXKL0scdb8OnlxXjlcN15zXaJAjHQY0znmTEAyLXHoYY1Y1GBYYyIwmrwOZWj2XykHgCwys9dm5+8vAip8Rb8mLNjFKSGTv0bvvrk2tn4NVowjBFRWE3LTERSrAm7/Wj++uqROhSmWjE5PcGv106IMeHzV0zBWyebBo5tIgpEJHTf98m1x6Gpqx9dfU69h0IaYxgjorAyGN6rGxtJV58Tb5U3XdR1fzS3Lc5Hji0OD758NOB+ZkSNETQzluc9e1bvXmNKKdzxx5342j8P8P8pjTCMEVHYLShMwanGLtR39A57zbYTDeh3ubEqwJ2bMSYj7l1Vgv01bXjp4LmxDpWijG9mLCXeovNIPDNjgP69xo7VdWDbiUY8ses0frP1pK5jmagYxogo7Hz9xsoqhy+033ykHkmxJpQW2gN+/Q+/LxdTMhLwk1eOwelyBz1Oij4NHX1IibfA7OcxX1qKlF5jG/fXwiDAqhmZ+PHLx/hLjgb0/6+NiKLOrJxkxJmNwy5VutwKrx2txxXTM4L6oWg0CL589TScbOjCY29XjXW4AxwuN36ztRxvljdyuWaCauzUv8eYT1qCBbFmg64zY0op/PtALRYVpeLXt87H3DwbvvTUPhypbddtTBMRwxgRhZ3ZaMD7CmzDduLfV92C5q7+oJvLAsA1l2Tiimnp+MnLx3C6KTQ/zH6z5SQefOkYbvvDTlz7f9vx/N4zcHDmbUJp6OhDWqL+S5SApy+f3jsqj9V14FRDF66dk41YsxGPePsm/sdjZQP1dTR2DGNEpIuFhak4eq4dbT2Oix7bdLgeJoNgxdTgz/MUEfzgw7NhMgi++uz+Mc9k7a9pxa9eO4EPzJ2EBz4yG/0uN+79xz4sf3ALHnnjFDp6L/570PjTEEEzY4CnbizQLvxvljeipas/JO/vW6JcMysLAJCRFItHPlaKpq4+fO5ve9DndIXkfaIdwxgR6WJhUQqUAvZUXTw7tvlIHRYVpyA5bmwnF2Qnx+Hr187A26ea8MSu6qBfp9fhwpeeehdpCTH43vWzcNOCfLxy73I8+vFSFKRa8f2NR7D0h6/hBxuP4KzOO98oeEopz1FIEbCT0icvwJmx14834LY/7MQDLx0d83sPXqJMGxRQZ+cm4ycfnYvdlS345nMHuWQfAgxjRKSL+fk2mI1y0VJlZWMXyus7cdX04JcoB7t5QR4um5I6pqD045ePoby+Ew/eMAfJVk9ANBgEV07PxJN3LcH6L1yGldMz8MftFVj+4Bb81z/24dDZtpCMn8Knq9+FXof7vOCht7yUOLT1ONDux8xre68D9z+7HwCw/t2zfj1nJIOXKC/0/jmTcPdVJXh6Tw3+uL1iTO9DDGNEpJNYsxFzcm3YfUEY23ykDgACbmkxHBHBjz48By63wtefC7xP0tsnm/DomxW4Y3EBlg+zbDon14Zf3TIfW7+8Eh9bUoiXD53Dtf+3Hfc8uTcUfwUKk0hq+OqT69tR2Tz6LxLf//cR1LX34rvXX4Lufhde2HtmTO994RLlhe69qgRrZ2XhBxuPYMux+jG9V7RjGCMi3SwsSsH+mjb09L9Xd/LqkXpMzUxAfqo1ZO+Tl2LFV9dMw9ZjDfjnO/7/gOrodeDLT7+LghQrvrZuul/v860PzMTb91+FWxbm44V9Z1HR2DWWoVMYRWIY87W3GK1ubOuxevyjrBqfWTEZty8uwKycJPx95+mglxCVUtgwxBLlYAaD4Kc3zsX0rCTc/fhelNd3BPVexDBGRDpaWJgCp1sNHOzd1u3ArsrmkM2KDfaxJYUoLbDjf/91CPXtwzebHey7/z6M2rYe/PTGebBaTH6/V7LVjM+tmAzA80OSxgff7sBIWqb0NX4dqW6srceB+589gJKMBNy7qgQiglsXFuDouQ68c7o1qPc9VteBkw1dWDfEEuVgVosJj9xZihizEZ96rCxkGweiDcMYEenm0kI7RIBd3nMqtx6vh8utxtTSYjgGg+DBG+agz+nGN58fveh48+E6PFVWg8+umIxLCwJvPJufakVxWjy2HmsIdsgUZpE4M2azmpEQYxqx19j3/n0YDZ19+MlH5yLGZAQAXDdvEhJiTPj7zuD67A0sUV4y9BLlYDm2OPz+jktR29qLzz/+Dtu9BIFhjIh0kxRrxszspIHmr5uP1CMtwYJ5eTZN3q84PQFfWj0Vrxyuw4YDtcNe19TZh/v/uR8zspNw76qpQb/fimnp2HGqCb0Obv8fDxo6+mA0COzWyOgzBvh6jcUNOzO25Wg9nt5Tg88sL8bcQf/fJMSYcP28Sdiwvxat3YHNVg1eovQ3mF5aYMcPPzwbb51swnf+dTig9yOGMSLS2YLCFLxzugU9/S5sPVaPK6ZlwGjw/2DwQH3q8iLMyU3G/7xwCE1DNK1USuEbzx1Ee48TP7txLiym4L9NrpyWgT6nG2+fahrLkClMGjv7kBpv0fS/v2B4Gr9ePDPW1uPA/f/cj6mZCbhnVclFj9+2qAB9TjeeDaBOEvB/ifJCH7k0F3ctL8Zfd1Th4BnuJg6EpmFMRNaIyDERKReR+4d4fLmIvCMiThG5QcuxEFFkWlSUgl6HG4++WYGOXidWzQz9EuVgJqMBD94wB+29DvzvEL/BP7/vDF46dA5funoqZmQnjem9FhWlINZswOtcqhwXGjr6IqpezMc3M3bh0vp3/30YjZ395y1PDjZzUhLm59vw+M6qgAr5A1mivNB/XF4EwLMLmfynWRgTESOAhwCsBTATwC0iMvOCy04D+DiAx7UaBxFFtgXeQ8N/u/UkLCYDlpWkaf6e07OS8IUrSrD+3bPYdLhu4P7ath5864VDKC2w49PLisf8PrFmI5YUp7KIf5xo6Iyshq8+eSlWdPY50dr9Xt+w147W4Zk9NfjcismYk2sb9rm3LszHyYauYY8eu1AwS5SDZSTFoiDVOlAHSv7RcmZsIYBypdQppVQ/gCcBXD/4AqVUpVJqPwBW+xFFqbSEGBSnx6Ozz4nLJqcGtGtxLD63cjKmZyXiG88dQFuPA263wlee3g+XW+GnN84N2VLVymkZqGzqZouLcSDSuu/7+HZU+tpbtHU78LV/HsC0zER88aopIz73/XMmISnWhL/vPO3Xex2v6wxqiXKwBYUpKKtshtvNzvz+0jKM5QAYfP5Ijfe+gInIXSJSJiJlDQ2c7ieaaBZ5Z8e0XqIczGIy4Mc3zEVTVz++v+Ew/razCtvLG/GNa2egIDU+ZO+zcpqnUSxnxyKbUgqNnZG5TOnrNeYr4v/OKMuTg8VZjPjw+3Lx0sFavw723rD/bNBLlD4LC1PQ0u3AyYbOoF8j2oyLAn6l1MNKqVKlVGl6evAHBxNRZLp6ZhYSY0xYrUFLi5HMzk3GZ5YX46myGnzv30ewYmo6bl2YH9L3KEiNZ4uLcaCtxwGHS0XmzFiKd2asuRubD9fh2Xdq8J8rJ2N2brJfz79tUT4cLoVn9tSMeN1Ylyh9fKUHXKr0n5Zh7AyAvEG3c733ERGd54rpGdj/7auRkRQb9ve++6oSTE6PR5zFiAdvmAOR0O+kY4uLyBeJPcZ8kmLNSI4z49DZdnz9uQOYnpWIL1558e7J4ZRkJmJhUQqe2HV6xKXDUCxRAkBhqhXpiTEXHXVGw9MyjO0GUCIiRSJiAXAzgPUavh8RjWNahCB/xJqNeOazS7Hh7suRqVEYZIuLyNcw0H0/cnqMDZZrj8P6d8+iqcuzPBloy5XbFuWjqqkbb55sHPaaUCxRAp7/lxcWpmB3ZcuYXieaaBbGlFJOAF8A8DKAIwCeUkodEpHviMh1ACAiC0SkBsBHAfxeRA5pNR4iouHY4y0DBzJrgS0uIp9vZiwjAmfGgPfqxj6/cjJm5fi3PDnYmllZSIm34O87hi7k9y1RLixKCcns4IJCO8609uBM6+gHnBOg6bYlpdRGABsvuO9bg77eDc/yJRHRhHV+i4tL9B4ODWFgmTIh/Evl/rhyRgb6nC58IYDlycFiTEbccGku/ri9AnXtvRfNAvuWKD9+WVEohjtQN7a7ohk584PauxdVxkUBPxHReOdrcVHJFhcRqbGzHxajAUlx4WmtEqgbS/Pwp08sHNOJELcszIfLrfDU7uqLHttwIPhGr0OZnpWExBgTi/j9xDBGRBQGE6HFRVNnH8619eo9DE14uu9bdKtdDIeitHhcPiUNT+w6DdegQn6lFDbsPxuyJUoAMBoElxbaB86dpZExjBERhUFBajyK0uKx9fj4rRv74hN7cccfd+o9DE1Eavf9ULt1UT7OtvXi9ePv/VLgW6K8ds6kkL7XgsIUlNd3orkrsIPKoxHDGBFRmKyYmo63T47PFhf1Hb14+1QTTtR3TshmnpHafT/UVs/MRHpizHmF/KFeovRZ6Ksb41LlqBjGiIjCZOW09HHb4uLlQ3XwnTX96pG6kS8ehyK1+36omY0G3Fiaiy3H6nGmtUeTJUqfObnJsJgM7DfmB4YxIqIwWVycihjT+GxxsXF/LSanx2NGdhI2Hx6/dW9DcbkVmqJkmRIAbl6QDwXgH7tOv7dEOXtsjV6HEmMyYl6ujTNjfmAYIyIKk1izEUsmp467Iv7Gzj7srGjCutnZWD0jA2VVzWiZQHVAzV39cKvI7L6vhbwUK1ZMTceTu6vxwr4zMAhwzazQLlH6LCiy4+DZdnT1OTV5/Qv9bUcVPve3PedtUBgPGMaIiMLoinHY4uKVQ3VwK2Dd7GysmpkJtwK2jLNAOZLGge770RHGAOC2RQWo7+jDH7ZXYGFRCjIStemvtqAwBS63wt7TrZq8/mBut8Jvt57EiwfP4e87qzR/v1BiGCMiCqPx2OLixYO1KEqLx/SsRMyalIzMpBhsnkB1Y5F8LqVWrpiWjuzkWPQ73ZosUfpcWmCHQcJzaPg7p1twprUHdqsZP37pGOrbx08bFoYxIqIwGm8tLpq7+vHWySasnZUFEYHBILhqRiZeP9aAPuf42xU6lPe670dPGDMZDbh9cQFiTAbNligBIDHWjJmTksJSxP/8vjOINRvw108tQp/Lje9uOKL5e4YKwxgRUZiNpxYXmw6fg8utsG7Q7MnqGZno6ndhx6mJUZg9sEwZRTNjAPDZFZPxxn1XaLZE6bOgMAV7q1vQ73Rr9h4Olxsb9tdi9cwszMpJxudXTsG/3j2LN8bJLz0MY0REYeZrcbFjHLS42HjgHPJTrLhkUtLAfUsmpyLObMTmwxNjqbKhow9xZiPiLUa9hxJWRoNcdEalFhYWpqDX4cbBs22avcf2E41o6Xbg+rmexrWfXVmM4rR4/PcLB8fFLz0MY0REYeZrcbE1wltctHU78GZ5I9bOzjrvmKBYsxHLStLw6pE6KDW+dq0Nxdd9fyIfhaSn0kJP81ctj0Z6ft8Z2KxmLJ/qqcmMMRnxvQ/OQlVTN36zpVyz9w0VhjEiojAbLy0uXjl8Dk63wrpZFxd4r5qZibNtvThc267DyEIrWrrv6yU9MQbFafGa1Y119zvxyqE6rJudfd5B6kunpOFD83Pw29dPorw+sk+NYBgjItLByqnpEd/i4sWD55Bji8Oc3OSLHrtyegZEMCEawHq671v0HsaEtqAwBWVVLXBr0P9r0+E69DhcA0uUg3193QzEmY345vMHInoWl2GMiEgHK6dlAIjcFhftvQ5sO9GAdRcsUfqkJcTgffn2CdHigjNj2ltQlIK2HgeO13eE/LVf2HcWk5JjscC7HDpYemIM7l87AztONeO5vWdC/t6hwjBGRKSDwrR4FKZaI7bFxebDdXC4FNaO0IPqqhkZOHCmDbVtPWEcWWg5XG60dDuQnqB9IXs0W+gNSqFeqmzu6scbxxvwgXmTYDAMXfN384I8zM+34fsbjqC1OzJPjmAYIyLSycppGRHb4mLjgXOYlByL+Xm2Ya9ZPSMTAPDqkeBn9zr7nCgP8WxJQ0cf/rajyq9/r02dnh/OaYlcptRSXkocMpNisKuyJaSvu/FALZxuhevn5gx7jcEg+MGHZqO1x4EHXjoa0vcPFYYxIiKdrIjQFhcdvQ68caIBa2Zlj7jDcEpGAgpSrUEvVSql8Lm/7cG6X25HdXN3sMO9yH8/fxDffP4grvv1dhw+O/IGg2hs+KoHEcGCwhTsrmgOae3WC/vOYGpmAmZkJ4543YzsJHzq8iI8sasae6oirz8ewxgRkU6WRGiLi9eO1qPf6ca62SN3ZhcRrJqRibdONgV1EPTWYw3YdqIR/S43Hnz5WLDDPU9ZZTNeOnQO75+TjZZuBz740Jt4+I2TwxaON3R6jsxhzZj2Fhal4Fx7L2paQrOsXdPSjd2VLbh+Xo5fbUnuuaoEk5Jj8Y3nDsLh0q4BbTAYxoiIdOJrcfF6hNWNbTxQi8wkT4H+aFbNyES/041tJxoDeg+ny43vbzyC4rR4fHbFZPzr3bPYV90a5Ig9lFL4wcYjyEyKwY9vmIuX712OldPS8YONR3HbH3bibOvFIaCxw7tMyZkxzS0sCm2/sfXvngUAXDfELsqhxMeY8O3rLsHRcx14dHtFSMYQKgxjREQ6Wjk1HRWNXahqiowWF119Tmw91oC1s7KHLYgerLTQjqRYU8BLlU/srkZ5fSfuXzsdX7hyCtISLPjBhiNjWsJ66eA5vHO6FV9aPRVxFiNS4i34/R2X4sGPzMG7Na1Y84s3Bn6A+zR0Rt8h4XqZmpGI5Dgzdofo0PD1+87i0gI78lKsfj/n6kuysHpmJn6x+QRqWkK3ND5WDGNERDrytbj46SvHIyKQbTlWjz6nG2v9PDzabDTgiukZeO1oPVx+9pBq73Xg55uOY3FxClbPzERCjAn/tXoqdlU245Ugj1hyuNx44KWjmJqZgBsuzRu4X0Rw44I8vHjPMkzOSMDdT+zFvU/uRVuPA4CnZiwx1oRYc3QdhaQHg0FQWmAPyczY0XPtOHquA9fP829WbLBvX3eJ55/rD495HKHCMEZEpKPCtHjctigfGw7UYsWPt+Jjj+7CK4fOwTmGmhany40DNW1BbePfeKAWaQkxA0fY+GPVjEw0d/Vj72n/dso9tKUcLd39+Oa1MwdqfW4qzcOUjAQ88OLRoOp5Ht95GpVN3fja2hkwDjGjV5Aaj6c/swT/tWoq/rW/Fut+uQ07TjV5eoxxiTJsFhSl4FRj18DGiWC9sO8sjAY57wB7f+XY4vBfq0uw+UgdXj50bkzjCBWGMSIinX3/Q7Px5levxL2rSnD8XAfu+useLHtwC365+QTq2ntHfb5SCpWNXfjrjip85q9lmP/dTfjAr7fj6p+/EVDbiO5+J7YcbcDaWVlDBprhrJiWDpNBsMmPpcrq5m78aXslPjw/F7Ny3uvsbzIa8LW103GqsQtP7Drt93sDnt2fv3z1BJYUp2LltPRhrzMZDbhnVQme+ewSmI2CWx7ZgTeONyCNS5Rh42vMWjaGpUq3W2H9vrNYVpIWdK3fJy4rwvKp6TBEyHmkDGNERBEgKzkW966aiu1fvQK/u/1STMlIwM83H8fSH72Gz/1tD7afaDxvR2Brdz82HqjF1/55AMt/vAUrf7IV//38QRw8045rZ2fjRx+eDQXgpt/vwKGzbX6N4fVjDehxuLB2lF2UF0qKNWNxcapf/cYeeOkoDAbgK9dMu+ixK6dnYElxKn6x+QTaex1+v//vXz+F5q5+fH3dDL921c3Pt2PD3ctw84I8dPQ5MSmZDV/DZXZOMmLNBuwaQxh753QLzrT2BLVE6WM2GvCXTy7E6pmZQb9GKJn0HgAREb3HZDRgzawsrJmVhcrGLjy+6zSeLqvGiwfPoSgtHiumpmNvdSsO1LTCrYCEGBOWTE7Fp5cV4/IpaShKix8IJIuKU3HbIztwy8M78NgnF2L+KLsjNx48h9R4y0C39EBcNSMD//uvw6ho7EJRWvyQ1+ypasG/99finqtKkDVEABIRfH3dDHzg19vxu60ncd+a6aO+77m2Xvxh+ylcP28SZg9xhuZw4mNM+OGH5+CjpXnISmIYCxeLyYB5ebYxFfE/v+8MYs0GrJ4Z2C8NkYwzY0REEaowLR5fXzcDb3/tKvz8prlIibfgrzuqYDIIvnilZ7lt77dW45GPleJjSwpRnJ5w3sxQUVo8nvrsEtjjLbj9Dzuxc4Tmsr0OF149UodrZmXBZAz8R8OqgW78Qy9VKqXwvQ2HkZEYg8+sKB72dWbnJuND83Pwx+0VQ7aiuNDPNh2D2w18+eqLZ9r88b58OybZ4oJ6LgVnYWEKDp9tR0cAs58+DpcbG/bXYvXMLCTETJz5JIYxIqIIF2s24kPzc/Hs55bi+PfW4tnPLcV/rZ6K0sIUmEcJTrl2K576zBJk2+Jw5592DdvT7PXjDejud2HdrMALogEgL8WK6VmJ2DTMbsh/76/F3tOt+PI102C1jPxD9MvXTIMC8JNXRm4Ee/RcO57eU4M7lxYE1N6A9LWgKAVuBbxzujXg52470YCWbgeu97O32HjBMEZENI4EUljvk5kUi3/ctRjFaQn49GNleGWIHWQvHqiF3WrGouLAlyh9Vs3IRFlVC1q6zt/F2etw4UcvHsXM7CR85H25o75Oji0On7ysCM/tPYODZ4avd/vRi0eRGGPC56+YEvSYKfzel2+H0SBBHRr+wr6zsFnNWD51+I0a4xHDGBFRFEhNiMETn16MmZOS8Lm/v4MX9p0ZeKzP6cLmI/W4embWqDNtI1k1MxMut8LW4+cX8v/5rUqcae3BN68duu3EUP7zismwxZnxg41DN4J9s7wRW4814ItXlsBm5SHf40l8jAmXTEoKuIi/u9+JVw7VYd3sbFhMEyu+TKy/DRERDSvZasbf/mMRLi2w495/7MNTu6sBANuON6Kzz4l1c4JbovSZk5OM9MQYbB60q7Kxsw8PvVaOVTMysHRKmt+vlRRrxj1XleCtk00Xnd3pdnuOPcqxxeGOJQVjGjPpY0FhCvZVt6LP6fL7OZsO16HH4ZpwS5QAwxgRUVRJiDHhsU8sxOVT0nDfs/vx5zcrsPFgLZLjzFg6OXVMr20wCK6anoHXjzWg3+lp3PqLzcfR43Dha+tmBPx6ty4qQFFaPH6w8ch5TXDXv3sWh8624yvXTGPn/HFqQWEK+p2e5sT+emHfWUxKjh3oVTaRMIwREUWZOIsRf7izFKtnZuLb/zqMf717FqtnZo5pidJn1YxMdPY5sbOiCSfqOvDErmrcvrgAk9MTAn4ti8mAr66ZjhP1nXiqrAaAp/7sxy8fw6ycJL8PiKbIs6DQ02Zlp591Y81d/XjjeAM+MG+SX2emjjcTZ18oERH5LcZkxG9uex++9NS7+Ne7Z/GBEAWby6akIdZswObDdTjd3A2rxYi7ryoJ+vWuuSQTpQV2/GzTcVw/bxL+vrMKZ1p78OMb5kzIH8rRIjUhBlMyEvD7109i7+lWXDIpCZdMSsLMSUnIscVd1Lx3w4FaON0K18/N0WnE2mIYIyKKUmajAb+4aR7+c+VkzMhOCslrxlmMuHxKOp7eU4Pufhe+sW4GUuKDL7AXEXzj2hn40G/ewoMvHcVze8/gimnpAdWfUWT6nw/MxNNlNTh0tg2vHq2Db5+GzWrGzOwkb0BLxiWTkvDC3jOYmpmAGdmJ+g5aIwxjRERRzGiQkAUxn9UzM7D5SB3yU6z42NKxF9jPz7fj/XOy8djbVTAIcP/awOvPKPIsK0nHshJPi4rufieOnuvAobPtOHy2DYfOtuOxt6sGag8BzxFa/hx3NR4xjBERUUitmpGJvJRyfPu6mYgxhabA/r5rpmPT4Tp8aH4OpmVNzNmRaGa1mPC+fDveN+jILofLjZMNnTh8th1VTd24fdHE3TkrQ/VviWSlpaWqrKxM72EQEVGY1bX3Ii0hJqjGt0R6EZE9SqnSka7hzBgREY0LmTzQmyYotrYgIiIi0hHDGBEREZGOGMaIiIiIdMQwRkRERKQjhjEiIiIiHTGMEREREelI0zAmImtE5JiIlIvI/UM8HiMi//A+vlNECrUcDxEREVGk0SyMiYgRwEMA1gKYCeAWEZl5wWWfAtCilJoC4OcAHtBqPERERESRSMuZsYUAypVSp5RS/QCeBHD9BddcD+Ax79fPALhKJurBU0RERERD0DKM5QCoHnS7xnvfkNcopZwA2gCkXvhCInKXiJSJSFlDQ4NGwyUiIiIKv3FRwK+UelgpVaqUKk1PT9d7OEREREQho2UYOwMgb9DtXO99Q14jIiYAyQCaNBwTERERUUTRMoztBlAiIkUiYgFwM4D1F1yzHsCd3q9vAPCaUkppOCYiIiKiiGLS6oWVUk4R+QKAlwEYATyqlDokIt8BUKaUWg/gjwD+KiLlAJrhCWxEREREUUOzMAYASqmNADZecN+3Bn3dC+CjWo6BiIiIKJLJeFsVFJEGAFUav00agEaN34PGjp/T+MDPKfLxMxof+DmNDxd+TgVKqRF3H467MBYOIlKmlCrVexw0Mn5O4wM/p8jHz2h84Oc0PgTzOY2L1hZEREREExXDGBEREZGOGMaG9rDeAyC/8HMaH/g5RT5+RuMDP6fxIeDPiTVjRERERDrizBgRERGRjhjGiIiIiHTEMHYBEVkjIsdEpFxE7td7POQhIo+KSL2IHBx0X4qIbBKRE95/2vUcY7QTkTwR2SIih0XkkIjc472fn1MEEZFYEdklIu96P6f/9d5fJCI7vd/7/uE9xo50JCJGEdkrIv/23uZnFGFEpFJEDojIPhEp894X8Pc8hrFBRMQI4CEAawHMBHCLiMzUd1Tk9WcAay64734AryqlSgC86r1N+nEC+H9KqZkAFgP4vPf/H35OkaUPwJVKqbkA5gFYIyKLATwA4OdKqSkAWgB8Sr8hktc9AI4Mus3PKDJdoZSaN6i3WMDf8xjGzrcQQLlS6pRSqh/AkwCu13lMBEAp9QY855cOdj2Ax7xfPwbgg+EcE51PKVWrlHrH+3UHPD9EcsDPKaIoj07vTbP3jwJwJYBnvPfzc9KZiOQCuBbAH7y3BfyMxouAv+cxjJ0vB0D1oNs13vsoMmUqpWq9X58DkKnnYOg9IlIIYD6AneDnFHG8y1/7ANQD2ATgJIBWpZTTewm/9+nvFwDuA+D23k4FP6NIpAC8IiJ7ROQu730Bf8/T9KBwonBRSikRYZ+WCCAiCQCeBXCvUqrd8wu9Bz+nyKCUcgGYJyI2AM8BmK7viGgwEXk/gHql1B4RWanzcGhklyulzohIBoBNInJ08IP+fs/jzNj5zgDIG3Q713sfRaY6EckGAO8/63UeT9QTETM8QezvSql/eu/m5xShlFKtALYAWALAJiK+X9D5vU9flwG4TkQq4SmXuRLAL8HPKOIopc54/1kPzy82CxHE9zyGsfPtBlDi3bFiAXAzgPU6j4mGtx7And6v7wTwgo5jiXrempY/AjiilPrZoIf4OUUQEUn3zohBROIArIanvm8LgBu8l/Fz0pFS6mtKqVylVCE8P4deU0rdBn5GEUVE4kUk0fc1gKsBHEQQ3/PYgf8CIrIOnrV6I4BHlVLf13dEBAAi8gSAlQDSANQB+B8AzwN4CkA+gCoANyqlLizypzARkcsBbANwAO/VuXwdnroxfk4RQkTmwFNUbITnF/KnlFLfEZFieGZhUgDsBXC7UqpPv5ESAHiXKb+slHo/P6PI4v08nvPeNAF4XCn1fRFJRYDf8xjGiIiIiHTEZUoiIiIiHTGMEREREemIYYyIiIhIRwxjRERERDpiGCMiIiLSEcMYERERkY4YxoiIiIh09P8B3HaaFkrEjeUAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 720x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.ticker as ticker\n",
    "\n",
    "plt.figure(figsize=(10,7))\n",
    "\n",
    "plt.ylabel('Average Loss')\n",
    "plt.plot(all_losses[1:])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:16:40.170444Z",
     "start_time": "2020-08-20T13:16:40.064366Z"
    }
   },
   "outputs": [],
   "source": [
    "torch.save(rnn, 'rnn_model.pkl')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:24:52.707246Z",
     "start_time": "2020-08-20T13:24:52.698271Z"
    }
   },
   "outputs": [],
   "source": [
    "def get_category(rnn, title):\n",
    "    input_tensor = title_to_tensor(title)\n",
    "    with torch.no_grad():\n",
    "        hidden = rnn.initHidden()\n",
    "        output = run_rnn(rnn, input_tensor)\n",
    "        topv, topi = output.topk(1)\n",
    "        return categories[topi.item()]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:30:17.778502Z",
     "start_time": "2020-08-20T13:30:17.773516Z"
    }
   },
   "outputs": [],
   "source": [
    "input_tensor = title_to_tensor(\"北大实验室招硕博连读保研学生\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:30:20.644213Z",
     "start_time": "2020-08-20T13:30:20.626262Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([ 603, 1297,  759,  249, 1533, 1224,  252,  142, 1570, 1447,  300,  811,\n",
       "         264,  429])"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "input_tensor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:30:33.621716Z",
     "start_time": "2020-08-20T13:30:33.610744Z"
    }
   },
   "outputs": [],
   "source": [
    "o = evaluate(rnn, input_tensor)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:31:00.275409Z",
     "start_time": "2020-08-20T13:31:00.252426Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.return_types.topk(\n",
       "values=tensor([[-0.1170]]),\n",
       "indices=tensor([[1]]))"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "o.topk(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:26:00.271309Z",
     "start_time": "2020-08-20T13:26:00.251315Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['考研考博', '招聘信息']"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "categories"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:37:26.165119Z",
     "start_time": "2020-08-20T13:37:26.148164Z"
    }
   },
   "outputs": [],
   "source": [
    "def get_category(title):\n",
    "    title = title_to_tensor(title)\n",
    "    output = evaluate(rnn, title)\n",
    "    topn, topi = output.topk(1)\n",
    "    return categories[topi.item()]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_category(title):\n",
    "    title = title_to_tensor(title)\n",
    "    output = evaluate(rnn, title)\n",
    "    topn, topi = output.topk(1)\n",
    "    return categories[topi.item()]\n",
    "while True:\n",
    "    title = input()\n",
    "    if not title:\n",
    "        break\n",
    "    print(categories)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:40:17.526545Z",
     "start_time": "2020-08-20T13:40:17.508593Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "考研心得\t考研考博\n",
      "北大实验室博士\t考研考博\n",
      "北大实验室招博士\t招聘信息\n",
      "考外校博士\t考研考博\n",
      "工作or考研?\t招聘信息\n",
      "急求自然语言处理工程师\t招聘信息\n",
      "校招offer比较\t招聘信息\n"
     ]
    }
   ],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:32:53.017140Z",
     "start_time": "2020-08-20T13:32:53.004177Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "【校招】今日头条后端开发工程师 招聘信息\n"
     ]
    }
   ],
   "source": [
    "print(\"【校招】今日头条后端开发工程师\", get_category(rnn, \"【校招】今日头条后端开发工程师\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:33:08.592301Z",
     "start_time": "2020-08-20T13:33:08.580281Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "毕业找房子 招聘信息\n"
     ]
    }
   ],
   "source": [
    "print(\"毕业找房子\", get_category(rnn, \"毕业找房子\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-20T13:28:25.755093Z",
     "start_time": "2020-08-20T13:28:25.739137Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "毕业求合租 招聘信息\n",
      "学校附近的公寓 招聘信息\n",
      "学校附近的公寓 招聘信息\n",
      "考博经验帖 招聘信息\n",
      "2021年秋季出国交流 招聘信息\n",
      "考研学校选择，纠结，求师哥师姐指导 招聘信息\n"
     ]
    }
   ],
   "source": [
    "\n",
    "print(\"学校附近的公寓\", get_category(rnn, \"学校附近的公寓\"))\n",
    "print(\"学校附近的公寓\", get_category(rnn, \"学校附近的公寓\"))\n",
    "print(\"考博经验帖\", get_category(rnn, \"考博经验帖\"))\n",
    "print(\"2021年秋季出国交流\", get_category(rnn, \"2021年秋季出国交流\"))\n",
    "print(\"考研学校选择，纠结，求师哥师姐指导\", get_category(rnn, \"考研学校选择，纠结，求师哥师姐指导\"))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
